package com.satan.juc.demo19;

import java.util.concurrent.PriorityBlockingQueue;
/*
PriorityBlockingQueue 是一个支持优先级的无界阻塞队列，它实现了 BlockingQueue 接口。
在这个队列中，元素按照它们的自然排序或者构造时提供的 Comparator 来决定优先级顺序。
这个队列不允许 null 元素，并且插入的元素必须实现 Comparable 接口。
*/
public class PriorityBlockingQueueExample {
    //在这个例子中，我们创建了一个 PriorityBlockingQueue 并添加了几个 Task 对象。
    //每个 Task 对象都有一个优先级，当从队列中取出元素时，优先级最高的元素（即优先级数值最大的）会首先被处理。
    //这是通过 Task 类的 compareTo 方法实现的，该方法定义了元素的优先级排序规则。
    public static void main(String[] args) throws InterruptedException {
        PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue<>();
        // 向队列中添加任务
        for (int i = 0; i < 10000; i++) {
            queue.put(new Task(i,"Task " + i));
        }

        // 从队列中检索并处理任务，直到队列为空
        while (!queue.isEmpty()) {
            Task task = queue.take();
            System.out.println("Processing task: " + task);
        }
    }

    static class Task implements Comparable<Task> {
        private int priority;
        private String description;

        public Task(int priority, String description) {
            this.priority = priority;
            this.description = description;
        }

        public int getPriority() {
            return priority;
        }

        public String getDescription() {
            return description;
        }

        // 根据优先级对任务进行排序，优先级高的任务排在前面
        @Override
        public int compareTo(Task other) {
            return Integer.compare(other.priority, this.priority); // 降序排列
        }

        @Override
        public String toString() {
            return "Task{" +
                    "priority=" + priority +
                    ", description='" + description + '\'' +
                    '}';
        }
    }
}
